SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[palicenciasacumuladasagentes]

@Documento INT,
@LicenciaAnalizar INT = NULL, 
@FechaDesde VARCHAR(10) = NULL ,
@FechaHasta VARCHAR(10) = NULL  

AS
SET NOCOUNT On

DECLARE @FA DATETIME
DECLARE @FAINT INT
DECLARE @FB DATETIME
DECLARE @FBINT INT
DECLARE @LICENCIA INT
DECLARE @FA1 DATETIME
DECLARE @FA11 DATETIME
DECLARE @FB1 DATETIME
DECLARE @LICENCIACONTROL INT
DECLARE @LIC INT
DECLARE @Agente INT

DECLARE @Error int


IF  @LicenciaAnalizar = -1 OR @LicenciaAnalizar = 0 
   SET @LicenciaAnalizar = NULL 

BEGIN TRANSACTION
    SET @Error=0

	SELECT @Agente = IdAgente FROM Tb_Agentes WHERE Documento =  @Documento
	
	IF object_id('tempdb..#Control1') IS NOT NULL  
			DROP TABLE #Control1
	IF object_id('tempdb..#Control2') IS NOT NULL  
			DROP TABLE #Control2
			
	CREATE TABLE #Control1 ( IDFecha INT primary key, LICENCIA INT)
	SET @Error = @@ERROR 
	IF @Error <> 0 GOTO Salir	

	
	CREATE TABLE #Control2(idcontrol INT IDENTITY NOT NULL, LICENCIA INT,DIAS INT)
	SET @Error = @@ERROR 
	IF @Error <> 0 GOTO Salir
	 
	DECLARE  TETAS CURSOR FORWARD_ONLY FOR
	
	SELECT CASE WHEN  @FechaDesde IS NULL THEN TT.FechaAlta ELSE CASE WHEN TT.FechaAlta >= @FechaDesde THEN TT.FechaAlta ELSE @FechaDesde END END AS FechaAlta,
	       CASE WHEN  @FechaHasta IS NULL THEN TT.FechaBaja ELSE CASE WHEN TT.FechaBaja <= @FechaHasta THEN TT.FechaBaja ELSE @FechaHasta END END AS FechaBaja,
	       TT.Licencia
	FROM (
		SELECT SS.FechaAlta FechaAlta,isnull(ss.FechaBaja,getdate()) FechaBaja ,ss.LICENCIA 
		FROM tb_ServiciosAgentes s 
			INNER JOIN tb_SubserviciosAgentes ss on s.idServicioAgente=ss.ServicioAgente
			WHERE S.AGENTE=@AGENTE AND ss.Licencia is not null 
			  AND (@LicenciaAnalizar IS NULL OR (@LicenciaAnalizar IS NOT NULL AND SS.Licencia=@LicenciaAnalizar))
			  AND (@FechaDesde IS NULL OR (@FechaDesde IS NOT NULL AND (SS.FechaAlta >= @FechaDesde OR isnull(ss.FechaBaja,getdate()) >= @FechaDesde)))
			  AND (@FechaHasta IS NULL OR (@FechaHasta IS NOT NULL AND (SS.FechaAlta <= @FechaHasta OR isnull(ss.FechaBaja,getdate()) <= @FechaHasta)))
		UNION 
		SELECT lh.FechaAlta FECHAALTA,isnull(lh.FechaBaja,getdate()) FechaBaja ,lh.licencia 
			FROM tb_LicenciasHistoricas lh 
			WHERE lh.Agente=@agente 
			  AND (@LicenciaAnalizar IS NULL OR (@LicenciaAnalizar IS NOT NULL AND LH.Licencia=@LicenciaAnalizar))
			  AND (@FechaDesde IS NULL OR (@FechaDesde IS NOT NULL AND (LH.FechaAlta >= @FechaDesde OR isnull(LH.FechaBaja,getdate()) >= @FechaDesde)))
			  AND (@FechaHasta IS NULL OR (@FechaHasta IS NOT NULL AND (LH.FechaAlta <= @FechaHasta OR isnull(LH.FechaBaja,getdate()) <= @FechaHasta)))
					) AS TT
	    order by licencia,FECHAALTA

	  	
   	 open TETAS
 	fetch next from TETAS into @FA,@FB,@LICENCIA
 	INSERT #Control2 VALUES (@LICENCIA,0)
    	set @licenciacontrol=@licencia
    	SELECT @FA11=MIN(TT.FECHAALTA) FROM 
			(select ss.FechaAlta FECHAALTA from tb_ServiciosAgentes s 
			inner join tb_SubserviciosAgentes ss on s.idServicioAgente=ss.ServicioAgente
			where S.AGENTE=@AGENTE AND ss.Licencia is not null
			union
			select lh.FechaAlta FECHAALTA from tb_LicenciasHistoricas lh where lh.Agente=@agente
			) AS TT

	SET @FA1=@FA11
	SET @FB1=GETDATE()
	 WHILE (@FA1<=@FB1)
		      BEGIN
		         	SET @FAINT=convert(int,datepart(year,@FA1)*10000+ datepart(month,@FA1)*100+datepart(day,@FA1))
	  	         	Insert #Control1 VALUES (@faint,0)
			SET @FA1=DATEADD(DAY,1,@FA1) 
		      END   
   	SET @FA1=@FA11
	while @@FETCH_STATUS = 0
	  BEGIN

		if @licenciacontrol=@licencia
			BEGIN
		 		                 
				WHILE (@FA<=@FB)
				  BEGIN
					 SET @FAINT=convert(int,datepart(year,@FA)*10000+ datepart(month,@FA)*100+datepart(day,@FA))
		       		 	UPDATE #Control1 SET LICENCIA =1 WHERE IDFecha = @FAINT           
					 SET @FA=DATEADD(DAY,1,@FA) 
				  END
							 
			END
                 ELSE
		    BEGIN
		     
		        INSERT #Control2 VALUES (@LICENCIA,0)
		         WHILE (@FA1<=@FB1)
				  BEGIN
					 SET @FAINT=convert(int,datepart(year,@FA1)*10000+ datepart(month,@FA1)*100+datepart(day,@FA1))
					
					 
					 SELECT @LIC=LICENCIA FROM #CONTROL1 WHERE IDFECHA=@FAINT
					 IF @LIC=1
						begin
		       		       			UPDATE #Control2 SET DIAS=DIAS+1 WHERE LICENCIA=@LICENCIACONTROL 
							UPDATE #Control1 SET LICENCIA=0 WHERE IDFecha=@FAINT  
		       		 		  end        
					 SET @FA1=DATEADD(DAY,1,@FA1) 
				  END
			   
	                                         set @licenciacontrol=@licencia
				WHILE (@FA<=@FB)
				  BEGIN
					 SET @FAINT=convert(int,datepart(year,@FA)*10000+ datepart(month,@FA)*100+datepart(day,@FA))
		       		 	UPDATE #Control1 SET LICENCIA =1 WHERE IDFecha = @FAINT           
					 SET @FA=DATEADD(DAY,1,@FA) 
				  END
			  
		      END
		      SET @FA1=@FA11
		     
		       fetch next from TETAS into @FA,@FB,@LICENCIA
		    
			  
		 END
   SET @FA1=@FA11
	 WHILE (@FA1<=@FB1)
				  BEGIN
					 SET @FAINT=convert(int,datepart(year,@FA1)*10000+ datepart(month,@FA1)*100+datepart(day,@FA1))			 
					 SELECT @LIC=LICENCIA FROM #CONTROL1 WHERE IDFECHA=@FAINT
					 
					 IF @LIC=1
						begin
				       		       UPDATE #Control2 SET DIAS=DIAS+1 WHERE LICENCIA=@LICENCIAcontrol 
				       		       UPDATE #Control1 SET LICENCIA=0 WHERE IDFecha=@FAINT  
		       				   end        
					 SET @FA1=DATEADD(DAY,1,@FA1) 
				  END
			   
	

SELECT Licencia, L.Descripcion,  Dias FROM #Control2 C
    INNER JOIN Tb_Licencias L ON L.IdLicencia = C.Licencia

    
	         
SALIR:

close TETAS
deallocate TETAS
		
IF @Error <> 0 
	ROLLBACK TRANSACTION
ELSE 
	COMMIT TRANSACTION
GO
GRANT EXECUTE ON  [dbo].[palicenciasacumuladasagentes] TO [PersonalDocente]
GRANT EXECUTE ON  [dbo].[palicenciasacumuladasagentes] TO [PersonalDocenteDireccion]
GO
